package service

import (
	"github.com/gin-gonic/gin"
	"web_api_gin/dao"
	"web_api_gin/dto"
	"web_api_gin/util"
)

var SysMenu = SysMenuService{}

type SysMenuService struct {
}

// 获取菜单列表
func (s *SysMenuService) GetHasPermMenuList(ctx *gin.Context, groupKey string, userPermList []string) ([]*dto.SysMenusBig, error) {
	menuList, err := dao.SysMenu.GetMenuListByKey(ctx, groupKey)
	if err != nil {
		return nil, err
	}
	var menuListArr []*dto.SysMenusBig
	for _, menu := range menuList {
		if menu.PermId == 0 || (menu.PermName != "" && util.ArrayUtil.IsContain(userPermList, menu.PermName)) {
			menuListArr = append(menuListArr, menu)
		}
	}
	return menuListArr, nil
	//组装成树形结构数据
	//treeMenuList := s.BuildTree(menuListArr)
	//return treeMenuList, nil
}

// BuildTree 构建树结构数据,(由于需要保留菜单结构数据，因此每一次树结构菜单都需要在对应的service中实现，使用公共的树方法无法还原原始菜单数据)
func (s *SysMenuService) BuildTree(resources []*dto.SysMenusBig) []*dto.SysMenusBig {
	//定义根树，既id=0的根节点，我用的时候并不存在于数据库
	var rootResource = dto.SysMenusBig{}
	//创建一个map，把父级相同的地址归纳起来
	DataMap := make(map[uint32][]*dto.SysMenusBig, len(resources))
	//寻找对应的父级，添加子节点集合
	for key := range resources {
		pid := resources[key].ParentId
		DataMap[pid] = append(DataMap[pid], resources[key])
	}
	for key := range resources {
		if resources[key].ParentId == 0 {
			rootResource.Children = append(rootResource.Children, resources[key])
		}
		resources[key].Children = DataMap[resources[key].MenuId]
	}
	// 添加完成，既建立树形关系完成
	return rootResource.Children
}
